在專案開發過程中,如何妥善管理環境與依賴套件,往往比寫程式本身更重要。因為隨著時間推移,套件會更新、版本會衝突、專案會擴張,如果沒有一個良好的環境隔離與管理策略,最終一定會走向「環境地獄(dependency hell)」。
Python 的一大亮點就是虛擬環境 (Virtual Environment),它可以把每個專案所需要使用的元件獨立開來,避免不同專案之間互相干擾。但 Python 的相關工具至今仍處於「百家爭鳴」的狀態,不同社群與公司都有推出解決方案。以下整理出目前最常見的幾種工具:
venv
就足夠,簡單輕量。conda
,因為它能一次解決 Python + C/CUDA 的相依套件問題。poetry
,因為它的社群生態已經相對成熟,文件完整,學習成本低。hatch
。它的設計理念是下一代 Python 工程化的基石,未來可望成為標準。工具 | 推出時間/來源 | 功能範疇 | 特點 | 適合場景 |
---|---|---|---|---|
virtualenv | 2007 / 社群 | 虛擬環境 | 最早期的環境隔離工具,支援多版本 Python | 舊專案維護、需要向下相容 |
venv | 2012 (Python 3.3 內建) | 虛擬環境 | Python 官方內建,輕量、免安裝 | 學習、個人小專案 |
conda | Anaconda 發行 | 環境 + 套件 | 可同時管理 Python 與非 Python 套件(C/CUDA、R) | 資料科學、AI/ML 領域 |
pipenv | 2017 / Kenneth Reitz | 環境 + 套件 | 官方曾推薦,支援 Pipfile 鎖定版本,但近年社群較冷清 |
小型專案,已有 Pipenv 用戶 |
poetry | 2018 / 社群 | 環境 + 套件 + 發佈 | 整合專案管理,支援打包/發佈,活躍社群 | 中小型專案、套件開發 |
hatch | 2022 / PyPA | 環境 + 套件 + 專案全流程 | PyPA 官方力推,支援多版本測試、建置、發佈,符合 PEP 標準 | 長期團隊專案、需要工程化管理 |
在這一次鐵人賽的主題,我們的目標是打造 工程化的 Python 專案。既然如此,環境管理工具的選擇就非常關鍵。本系列將以 Hatch 作為主要的專案管理核心,因為它不僅能管理虛擬環境與相依套件,還能涵蓋建置、測試與發佈的完整流程。
所以從這裡開始,我們就要動手安裝 Hatch。安裝過程相當簡單,以下我會以 macOS 環境 為例進行示範(Linux 幾乎相同,Windows 則需調整安裝方式)。
建議使用 pipx
來安裝(避免污染全域 Python 環境):
如果你沒有安裝 pipx
,也可以直接用 pip install hatch
,但這樣會安裝在全域環境,不建議工程化專案這麼做。
# 安裝 pipx (如果還沒有安裝)
python3 -m pip install --user pipx
python3 -m pipx ensurepath
# 使用 pipx 安裝 Hatch
pipx install hatch
確認安裝成功:
hatch --version
假設我們要建立一個名為 demo-app
的專案:
hatch new demo-app
這會自動產生一個專案骨架,包含以下檔案結構:
demo-app/
├── src/demo_app/__init__.py
├── tests/
│ └── test_demo_app.py
├── pyproject.toml
└── README.md
src/
:程式碼放置目錄tests/
:單元測試pyproject.toml
:專案配置(PEP 621 格式)Hatch 預設專案會放在 src/
架構,這也是目前 Python 專案推薦的慣例,我們會在 Day 3 詳細介紹。
進入專案後,可以直接用 Hatch 啟動隔離環境:
cd demo-app
hatch shell
此時就已經進入 Hatch 管理的虛擬環境,後續安裝套件、執行程式、測試都能在這裡完成。
Hatch 預設已經幫你設定好 pytest,直接執行:
hatch run test
這樣一來,從環境建立 → 套件管理 → 測試執行,全部都透過一個工具完成,這就是 工程化的價值。
工具的選擇並不是「越新越好」或「換得越快越好」,而是要符合 專案的需求 與 團隊的工作習慣。如果你已經在使用 poetry,而且也能滿足日常的開發需求,那麼大可繼續沿用,沒有必要急著轉移到 Hatch。但若你正準備啟動一個全新的專案,尤其是涉及 團隊協作、長期維護或正式發佈 的情境,那麼投入一些時間學習 Hatch,很可能會在未來幫你節省大量環境維護與流程整合的成本。
在接下來的章節中,我們會持續以 Hatch 為基礎,逐步構建出一個工程化的 Python 專案,讓大家體驗從環境管理到測試、建置、發佈的完整開發流程。
Day 3 - pyproject.toml:現代 Python 專案的核心設定檔